!theme mono

skinparam classAttributeIconSize 0
skinparam classFontSize 12
skinparam classAttributeFontSize 11

title HealthSync 역설계 - Goal Service 데이터 설계서

package "Goal Service Database Schema" as goal_db #lightcoral {

  entity "user_mission_goals" as user_mission_goal {
    * goal_id : VARCHAR(50) <<PK>>
    --
    * user_id : VARCHAR(50)
    * is_active : BOOLEAN
    * created_at : TIMESTAMP
    * updated_at : TIMESTAMP
    --
    + 인덱스: idx_user_id_active
    + 인덱스: idx_created_at
  }

  entity "user_missions" as user_mission {
    * id : BIGINT <<PK>>
    --
    * goal_id : VARCHAR(50) <<FK>>
    * user_id : VARCHAR(50)
    * mission_id : VARCHAR(50)
    * mission_title : VARCHAR(200)
    * mission_description : TEXT
    * category : VARCHAR(50)
    * difficulty : VARCHAR(20)
    * estimated_time_minutes : INTEGER
    * is_active : BOOLEAN
    * current_streak_days : INTEGER
    * total_completed_count : INTEGER
    * start_date : DATE
    * created_at : TIMESTAMP
    * updated_at : TIMESTAMP
    --
    + 인덱스: idx_goal_id
    + 인덱스: idx_user_id_active
    + 인덱스: idx_mission_id
    + 인덱스: idx_category
    + 인덱스: idx_start_date
  }

  entity "mission_progress" as mission_progress {
    * id : BIGINT <<PK>>
    --
    * user_id : VARCHAR(50)
    * mission_id : VARCHAR(50) <<FK>>
    * completed_at : TIMESTAMP
    * notes : TEXT
    * earned_points : INTEGER
    * consecutive_days : INTEGER
    * created_at : TIMESTAMP
    --
    + 인덱스: idx_user_mission_date
    + 인덱스: idx_completed_at
    + 인덱스: idx_mission_id
    + 인덱스: idx_earned_points
  }

  entity "mission_completion_history" as mission_completion_history {
    * id : BIGINT <<PK>>
    --
    * user_id : VARCHAR(50)
    * mission_id : VARCHAR(50)
    * goal_id : VARCHAR(50)
    * completion_date : DATE
    * completion_time : TIME
    * completion_status : VARCHAR(20)
    * notes : TEXT
    * earned_points : INTEGER
    * streak_days_at_completion : INTEGER
    * created_at : TIMESTAMP
    --
    + 인덱스: idx_user_id_date
    + 인덱스: idx_mission_completion
    + 인덱스: idx_goal_id_date
  }

  note right of user_mission_goal
    **사용자 목표 관리**
    • 사용자별 목표 설정 단위
    • 한 번에 하나의 활성 목표만 가능
    • 목표 재설정 시 기존 목표 비활성화
    • goal_id는 UUID 형태로 생성
  end note

  note right of user_mission
    **사용자별 미션 정보**
    • 목표에 포함된 개별 미션들
    • Intelligence Service에서 추천받은 미션
    • 최대 5개 미션까지 선택 가능
    • 난이도별 포인트 차등 적용
    • 연속 달성 일수 추적
  end note

  note right of mission_progress
    **미션 수행 기록**
    • 일별 미션 완료 기록
    • 같은 날 중복 완료 방지
    • 연속 달성 일수 계산 기준
    • 포인트 적립 내역
  end note

  note right of mission_completion_history
    **미션 완료 이력 (분석용)**
    • 장기간 통계 분석용 테이블
    • 사용자별 달성 패턴 분석
    • 미션별 효과성 분석
    • 시간대별 완료 패턴 추적
  end note
}

package "관계 정의" as relationships {
  user_mission_goal ||--o{ user_mission : goal_id
  user_mission ||--o{ mission_progress : mission_id
  user_mission ||--o{ mission_completion_history : mission_id
  user_mission_goal ||--o{ mission_completion_history : goal_id
  
  note as n1
    **외래키 관계**
    user_missions.goal_id → user_mission_goals.goal_id
    mission_progress.mission_id → user_missions.mission_id
    mission_completion_history.mission_id → user_missions.mission_id
    mission_completion_history.goal_id → user_mission_goals.goal_id
    
    **참조 무결성**
    • CASCADE 업데이트
    • RESTRICT 삭제 (이력 보존)
    
    **논리적 관계**
    • User Service users ↔ user_mission_goals (사용자별 목표)
    • Intelligence Service ↔ user_missions (미션 추천)
    • 한 사용자는 하나의 활성 목표만 보유
    • 하나의 목표는 여러 미션을 포함
  end note
}

package "데이터 타입 및 제약조건" as constraints {
  note as n2
    **user_mission_goals 제약조건**
    • goal_id: UUID 형태, PRIMARY KEY
    • user_id: User Service와 일치, NOT NULL
    • is_active: DEFAULT TRUE
    • 사용자당 활성 목표는 1개만 (UNIQUE 제약)
    
    **user_missions 제약조건**
    • id: AUTO_INCREMENT
    • goal_id: NOT NULL, 존재하는 goal_id
    • mission_id: Intelligence Service에서 제공
    • mission_title: 최대 200자, NOT NULL
    • category: 'EXERCISE', 'NUTRITION', 'STRESS_MANAGEMENT', 'SLEEP', 'PREVENTIVE_CARE'
    • difficulty: 'EASY', 'MEDIUM', 'HARD'
    • estimated_time_minutes: 1~180분 범위
    • current_streak_days: 0 이상
    • total_completed_count: 0 이상
    • 목표당 최대 5개 미션 (체크 제약)
    
    **mission_progress 제약조건**
    • id: AUTO_INCREMENT
    • user_id: NOT NULL
    • mission_id: 존재하는 mission_id
    • completed_at: NOT NULL
    • earned_points: 0 이상
    • consecutive_days: 1 이상
    • 같은 날 같은 미션 중복 완료 방지 (UNIQUE 제약)
    
    **mission_completion_history 제약조건**
    • completion_status: 'COMPLETED', 'PARTIAL', 'SKIPPED'
    • earned_points: 0 이상
    • streak_days_at_completion: 0 이상
    • completion_time: 00:00~23:59
  end note
}

package "미션 카테고리 및 난이도" as mission_categories {
  note as n3
    **미션 카테고리별 예시**
    
    **EXERCISE (운동)**
    • 계단 오르기 10분
    • 산책 30분
    • 스트레칭 15분
    • 홈트레이닝 20분
    
    **NUTRITION (영양)**
    • 물 8잔 마시기
    • 금연하기
    • 금주하기
    • 건강한 간식 선택
    
    **STRESS_MANAGEMENT (스트레스 관리)**
    • 명상 10분
    • 심호흡 연습
    • 일기 쓰기
    • 취미 시간 갖기
    
    **SLEEP (수면)**
    • 규칙적인 취침시간
    • 11시 전 잠들기
    • 수면 8시간 유지
    • 카페인 섭취 줄이기
    
    **PREVENTIVE_CARE (예방관리)**
    • 혈압 측정하기
    • 체중 기록하기
    • 건강검진 예약
    • 병원 방문하기
    
    **난이도별 포인트**
    • EASY: 10~20 포인트
    • MEDIUM: 25~40 포인트  
    • HARD: 50~80 포인트
    • 연속 달성 보너스: +5 포인트/일
  end note
}

package "성능 및 운영 고려사항" as performance {
  note as n4
    **인덱스 전략**
    • user_mission_goals: (user_id, is_active) 복합 인덱스
    • user_missions: (user_id, is_active) 복합 인덱스
    • mission_progress: (user_id, mission_id, DATE(completed_at)) 복합 인덱스
    • mission_completion_history: (user_id, completion_date) 복합 인덱스
    
    **파티셔닝**
    • mission_progress: completed_at 기준 월별 파티셔닝
    • mission_completion_history: completion_date 기준 월별 파티셔닝
    
    **아카이빙**
    • 1년 이상 된 mission_progress 데이터 아카이빙
    • 비활성 목표 데이터는 history 테이블로 이관
    
    **캐싱 전략**
    • 활성 미션 목록: Redis 캐싱 (30분)
    • 오늘 완료한 미션: Redis 캐싱 (실시간)
    • 연속 달성 일수: Redis 캐싱 (6시간)
    • 미션별 통계: Redis 캐싱 (1시간)
    
    **배치 처리**
    • 매일 자정에 연속 달성 일수 재계산
    • 주간/월간 달성률 통계 생성
    • 장기 미완료 미션 알림 발송
    
    **모니터링 지표**
    • 일일 미션 완료율
    • 평균 연속 달성 일수
    • 카테고리별 인기도
    • 사용자별 참여율
    • 목표 재설정 빈도
  end note
}

package "데이터 분석 및 인사이트" as analytics {
  note as n5
    **사용자 행동 분석**
    • 미션 완료 시간대 패턴
    • 요일별 달성률 차이
    • 연속 달성 중단 요인 분석
    • 난이도별 지속 가능성
    
    **미션 효과성 분석**
    • 카테고리별 건강 개선 효과
    • 직업군별 선호 미션 유형
    • 연령대별 적합한 미션 난이도
    • 계절별 미션 선호도 변화
    
    **개인화 추천 개선**
    • 과거 달성 패턴 기반 추천
    • 유사 사용자 그룹 분석
    • 실패 미션 유형 회피
    • 성공 확률 높은 미션 우선 추천
    
    **동기부여 전략**
    • 포인트 시스템 효과성
    • 연속 달성 보상 최적화
    • 사회적 비교 효과 분석
    • 축하 메시지 반응 측정
    
    **KPI 지표**
    • 월간 활성 사용자 수 (MAU)
    • 평균 목표 지속 기간
    • 미션 완료율 (전체/개인별)
    • 사용자 리텐션율
    • 건강 개선 지표 상관관계
  end note
}